strftime関数は、tm構造体に設定されている日時情報を書式に従い編集します。なお、日時情報はgmtime関数とlocaltime関数で取得することができます。
#include <time.h>
size_t strftime(char *s, size_t max,
const char *format, const struct tm *tm);
*sは編集結果を格納する文字列を指定します。
maxは第1引数*sの長さを指定します。
*formatは書式を指定します。
*tmは日時情報を指定します。
戻り値として、第1引数*sに格納された文字数(終端のヌル文字は含まない)を返します。編集の結果、空文字の場合もありうるため、0が返ってきてもエラーとは限りません。
日時の編集には、次の変換指定文字を指定します。変換指定文字以外の文字はそのままコピーします。
変換指定文字 | 意味 |
---|---|
%a | 現在のロケールにおける曜日の省略名です。 |
%A | 現在のロケールにおける曜日の完全な名前です。 |
%b | 現在のロケールにおける月の省略名です。 |
%B | 現在のロケールにおける月の完全な名前です。 |
%c | 現在のロケールにおける一般的な日付・時刻の表記です。 |
%d | 日です。(01~31) |
%H | 24時間表記での時です。(00~23) |
%I | 12時間表記での時です。(01~12) |
%j | 年の初めから通算の日数です。(001~366) |
%m | 月です。(01~12) |
%M | 分です。(00~59) |
%p | 現在のロケールにおける「午前」と「午後」に相当する文字列です。英語の場合には’AM’または、’PM’です。正午は午後、真夜中は午前として扱われます。 |
%S | 秒です。(00~60) |
%U | 年の初めからの通算の週数です。(00~53)その年の最初の日曜日を第1週の始まりとして計算します。 |
%W | 年の初めからの通算の週数です。(00~53)その年の最初の月曜日を第1週の始まりとして計算します。 |
%x | 現在のロケールにおける一般的な日付表記です。時刻は含みません。 |
%X | 現在のロケールにおける一般的な時刻表記です。日付は含みません。 |
%y | 西暦の下2桁(世紀部分を含まない年)です。(00~99) |
%Y | 世紀部分を含めた(4桁の)西暦年です。 |
%Z | タイムゾーンまたは、ゾーン名または、それらの省略名です。 |
ロケール(地域情報)はLC_TIMEカテゴリに応じて解釈されます。(LC_ALLが設定されている場合にはLC_TIMEよりもそちらが優先されます。)ロケールの設定・参照はsetlocale関数で行うことができます。
プログラム 例
#include <stdio.h> #include <time.h> #include <locale.h> #include <stdlib.h> int main() { time_t timep; struct tm *time_inf; char buff[100]; timep = time(NULL); time_inf = localtime(&timep); /* 表示 */ strftime(buff, sizeof(buff), '%Y年%m月%d日(%a) %p%I時%M分%S秒 %Z', time_inf); printf('%s\n', buff); strftime(buff, sizeof(buff), '%c', time_inf); printf('%s\n', buff); strftime(buff, sizeof(buff), '%x %X', time_inf); printf('%s\n', buff); /* ロケールを環境変数から取得して設定 */ if (setlocale(LC_ALL, '') == NULL) { fprintf(stderr, 'ロケールが設定できませんでした\n'); exit(EXIT_FAILURE); } printf('\nロケールを設定\n'); /* 表示 */ strftime(buff, sizeof(buff), '%Y年%m月%d日(%a) %p%I時%M分%S秒 %Z', time_inf); printf('%s\n', buff); strftime(buff, sizeof(buff), '%c', time_inf); printf('%s\n', buff); strftime(buff, sizeof(buff), '%x %X', time_inf); printf('%s\n', buff); return 0; }
例の実行結果
$ date 2008年 7月 25日 金曜日 15:22:31 JST $ $ ./strftime.exe 2008年07月25日(Fri) PM03時22分35秒 JST Fri Jul 25 15:22:35 2008 07/25/08 15:22:35 ロケールを設定 2008年07月25日(金) 午後03時22分35秒 JST 2008年07月25日 15時22分35秒 2008年07月25日 15時22分35秒 $